{***************************************************************
    SpyGestion  Copyright (C) 2008 Christophe KOALI <nature2gas@gmail.com>
    
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.
    
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
    
    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
    
****************************************************************}
unit modParsingClassIGalaxie;

interface

uses modParsingClassBase,
     modBaseType,
     Classes,
     sFonctionsChaines,
     SysUtils,
     Windows,

     modGalaxiePlanetes,

     LibXmlParser;



type

    ////////////////////////////////////////////////////////////////////
    // La page galaxie ne possède pas d'entête de ressource
    // Les types de la galaxie sont definit dans modGalaxiePlanetes
    TParsingGalaxie = class(IParsingRedirection)
    private
        // Galaxie, Systeme solaire et SessionKey de la page parsée
        FGalaxie: integer;
        FSystemSolaire: integer;
        FSessionKey: string;



        // Liste des planetes du systeme solaire
        FListPlanete: TListGalaxiePlaneteSP;


        FInScript: boolean;
        FScriptBaliseNum: integer;
        //FAllowOneError: boolean;

        // Lors du deuxieme parsing
        //FInTableauGalaxie: boolean;

        FInTable: boolean;
        FTableLigne: integer;
        FTableColonne: integer;

        FInFont: boolean;
        FInLink: boolean;


        // Pour savoir si on est dans les paranthèses pour idenfier les flags inactif/vacances/noob
        FInTagOption: boolean;

        FStateColPlanete: integer;

        FCurrentPlanete: TGalaxiePlanete;

        // tampon pour extraire correctement l interieur des balises scripts
        FFullContent: string;
        FFontColor: string;

        // Tout comme pour les stats, cela évite d'ajouter la première page parsée
        // car les pointeurs seront "perdu" (jamais libéré)
        FDontAddPointeur: boolean;



        // les deux premiers balises peuvent etre identifie avec le parseur
        // et on stop le parseur a la fin de l extraction de la seconde balise script utile
        //procedure TraitementPremiereBaliseScript;
        //procedure TraitementSecondeBaliseScript;

        // Remet a zero que les champs variable
        procedure InitPlanete;

        procedure ExtractLuneInfoFromStr(s: string);
        procedure ExtractRuinesInfoFromStr(s: string);

        //procedure TraitementFlags(sFlags: string);
        procedure CheckAndAjoutCurrent;
    public
       property Galaxie: integer       read FGalaxie;
       property SystemSolaire: integer read FSystemSolaire;
       property SessionKey: string    read FSessionKey;

       property DontAddPointeur : boolean read FDontAddPointeur write FDontAddPointeur;


       property ListPlanete: TListGalaxiePlaneteSP read FListPlanete;
       


       /////////////////////////////////////////////////////////////////////////
       // Implémentation de IParsingRedirection

        // initialise l'interface
        procedure Initialisation; override;

        // obtient le résultat d'analyse
        function  GetFinalState: TParsingResultState; override;

        procedure SetFullURLFromBase(const BaseLink: string); override;


        procedure ScanOnStartTag(Sender: TObject; TagName: string; Attributes: TAttrList); override;
        procedure ScanOnEndTag(Sender: TObject; TagName: string); override;
        procedure ScanOnContent(Sender: TObject; Content: string); override;

       //
       /////////////////////////////////////////////////////////////////////////


       
       constructor Create;
       destructor Destroy; override;

    end;

implementation

uses modLanguageParsing,
     sHTMLFonctions,

     ESBDates,
     modCore;


     
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
// Galaxie

procedure TParsingGalaxie.SetFullURLFromBase(const BaseLink: string);
begin
    // rien à faire
    inherited;
end;

procedure TParsingGalaxie.Initialisation;
begin

    inherited;

    FInScript := false;
    FScriptBaliseNum := 0;
    FListPlanete.Clear;

    FGalaxie       := -1;
    FSystemSolaire := -1;
    FSessionKey    := '';

  //  FInTableauGalaxie := false;
    FInLink := false;

    InitPlanete;
    FError := false;
    //FAllowOneError := false;


       // initialisation pour le second parsing
       FInTable     := false;
       FTableLigne  := -1;
       FTableColonne:= -1;
       FInFont := false;

       FInScript  := false;
       FScriptBaliseNum := 0;

       FInFont := false;
       FInLink := false;
       FStateColPlanete := -1;


       FFullContent := '';
       FFontColor   := '';

       FListPlanete.Clear;

     //  FInTableauGalaxie := true;

    



end;

function TParsingGalaxie.GetFinalState: TParsingResultState;
begin
    Result := PRESULT_ECHEC;


    FFullContent := '';
    FFontColor   := '';

    if FError then begin
       exit;
    end;

    if FListPlanete.Count = 16 then begin
       // indice 15 c'est la dernière planète
       FListPlanete.Delete(15);
    end;

    Result := NoT(PRESULT_ECHEC);


end;


// Fonction obsolete avec la nouvelle version de la galaxy
// Champ de ruines M:0,K:1.800
procedure TParsingGalaxie.ExtractRuinesInfoFromStr(s: string);
var s2: string;
    xPos: integer;
begin

    s := trim(s);

    // Verification basique
    xPos := pos('ruines', lowercase(s));
    if xPos = 0 then exit;

    xPos := LastDelimiter(' ', s);

    if xPos = 0 then exit;
    System.Delete(s, 1, xPos);


    s := sfcRemplace(s, '.', '');

    // M:0,K:1.800
    s2 := sfcTokenGet(s, 1, ',');
    FCurrentPlanete.Ruines.Metal := sfcTokenGetInt(s2, 2, ':', -1);

    s2 := sfcTokenGet(s, 2, ',');
    FCurrentPlanete.Ruines.Cristal := sfcTokenGetInt(s2, 2, ':', -1);

end;

// Fonction obsolete avec la nouvelle version de la galaxy
// Lune S:8831,T:15
procedure TParsingGalaxie.ExtractLuneInfoFromStr(s: string);
var s2: string;
    xPos: integer;
begin

    s := trim(s);

    // Verification basique
    xPos := pos('lune', lowercase(s));
    if xPos = 0 then exit;

    xPos := pos(' ', s);

    if xPos = 0 then exit;
    System.Delete(s, 1, xPos);


    s := sfcRemplace(s, '.', '');
    
    // S:8831,T:15
    s2 := sfcTokenGet(s, 1, ',');
    FCurrentPlanete.Lune.Surface := sfcTokenGetInt(s2, 2, ':', -1);

    s2 := sfcTokenGet(s, 2, ',');
    FCurrentPlanete.Lune.Temperature := sfcTokenGetInt(s2, 2, ':', maxint);


    if FCurrentPlanete.Lune.Temperature = maxint then begin
       // echec, la temperature pouvant etre negative, on se base sur la surface
       // pour s assurer que la lune existe
       FCurrentPlanete.Lune.Surface := -1;

    end;



end;


procedure TParsingGalaxie.InitPlanete;
begin

   
   FCurrentPlanete.Location.Position := -1;

   // Nom de la planète
   FCurrentPlanete.NomPlanete     := '';

   // Nom du joueur
   FCurrentPlanete.Joueur  := '';

   // Alliance du joueur
   FCurrentPlanete.Alliance:= '';


   FCurrentPlanete.Lune.Surface := -1;
   FCurrentPlanete.Lune.Temperature := maxint;

   FCurrentPlanete.Ruines.Metal   := 0;
   FCurrentPlanete.Ruines.Cristal := 0;

   // Il y a jamais de deuterium dans les ruines
   FCurrentPlanete.Ruines.Deuterium := 0;
   FCurrentPlanete.Ruines.Energie   := 0;

   FCurrentPlanete.Position := -1;
   FCurrentPlanete.HaveToBeUpdatedFixed := true;

   FCurrentPlanete.Flags := 0;

end;






procedure TParsingGalaxie.CheckAndAjoutCurrent;
begin

    if FCurrentPlanete.Location.Position > 0 then begin

       if (FCurrentPlanete.Joueur = '') and (FCurrentPlanete.NomPlanete = '') and (FCurrentPlanete.Alliance = '') then begin
          // Planète non colonisée
          sfcFlagsAdd(CNT_GALAXIE_FLAGS_PLANETE_NON_OCCUPEE, FCurrentPlanete.Flags);
       end;


       if FDontAddPointeur = false then
          FListPlanete.Ajout(FCurrentPlanete);

    end;

    // Initialise l element
    InitPlanete;
end;


procedure TParsingGalaxie.ScanOnStartTag(Sender: TObject; TagName: string; Attributes: TAttrList);
var CurrBalise, strx, sLang: string;
    xPos: integer;
begin

   TagName := lowercase(TagName);

   if TagName = 'script' then begin
      FInScript := true;


      Inc(FScriptBaliseNum);


   end else if TagName = 'table' then begin
      FInTable := true;
      FTableLigne := 0;
      FTableColonne := 0;

   end else if TagName = 'tr' then begin
      Inc(FTableLigne);
      FTableColonne := 0;


      if FTableLigne > 2 then begin
         // Ajoute l element
         if FCurrentPlanete.Location.Position > 0 then begin

            if (FCurrentPlanete.Joueur = '') and (FCurrentPlanete.Alliance = '') then begin
               // Planète non colonisée
               sfcFlagsAdd(CNT_GALAXIE_FLAGS_PLANETE_NON_OCCUPEE, FCurrentPlanete.Flags);

               if FCurrentPlanete.NomPlanete <> '' then begin
                  // La planète vient d'être détruite
                  sfcFlagsAdd(CNT_GALAXIE_FLAGS_ASTEROIDES, FCurrentPlanete.Flags);

               end;

            end;

            if FDontAddPointeur = false then
               FListPlanete.Ajout(FCurrentPlanete);
         end;

      end;

      // Initialise l element
      InitPlanete;

   end else if (TagName = 'td') or (TagName = 'th') then begin
      Inc(FTableColonne);
      FStateColPlanete := 0;
      FInTagOption := false;

      CurrBalise := Attributes.Value('colspan');

      if (CurrBalise <> '') and (FTableLigne > 10) then begin
         // on est à la fin du tableau
         // on pourrait même arrêter le parsing
         FInTable := false;
      end;

   end else if TagName = 'font' then begin
      FInFont := true;
      FFontColor := Attributes.Value('color');

   end else if TagName = 'a' then begin
      FInLink := true;

      // On utilise FFullContent
      FFullContent := Attributes.Value('title');

      if (FInTable) and (FTableLigne >= 3) then begin

         if (FTableColonne = 4) then begin


   // <a style="cursor:pointer"
   //	onmouseover="this.T_WIDTH=250;this.T_OFFSETX=-110;this.T_OFFSETY=-110;this.T_STICKY=true;this.T_TEMP=50;
   // return escape('&lt;table width=\'240\'&gt;&lt;tr&gt;&lt;td class=\'c\' colspan=\'2\'&gt;Lune [1:1:1]&lt;/td&gt;
   // &lt;/tr&gt;&lt;tr&gt;&lt;th width=\'80\'&gt;&lt;img src=\'http://80.237.203.201/download/use/asgard/planeten/small/s_mond.jpg\'
   // height=\'75\' width=\'75\'/&gt;&lt;/th&gt;&lt;th&gt;&lt;table width=\'120\'&gt;&lt;tr&gt;&lt;td colspan=\'2\' class=\'c\'&gt;
   // Propriétés&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;
   // Taille :&lt;/td&gt;&lt;th&gt;44&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;
   // Température :&lt;/td&gt;&lt;th&gt;-43&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=\'2\' class=\'c\'&gt;
   // Actions :&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th style=\'text-align: left\' colspan=\'2\'&gt;&lt;font color=\'#808080\'&gt;Espionner&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href=\'flotten1.php?session=00000&galaxy=4&system=1&planet=1&planettype=0&target_mission=3\'&gt;Transporter&lt;/a&gt;&lt;br /&gt;&lt;a href=\'flotten1.php?session=0000000&galaxy=1&system=0&planet=1&planettype=3&target_mission=1\'&gt;Attaquer&lt;/a&gt;&lt;br /&gt;&lt;a href=\'flotten1.php?session=0000000&galaxy=2&system=10&planet=10&planettype=3&target_mission=5\'&gt;Stationner chez un allié&lt;/a&gt;&lt;br /&gt;&lt;a href=\'flotten1.php?session=000011&galaxy=4&system=1&planet=1&planettype=3&target_mission=9\'&gt;Détruire&lt;/a&gt;&lt;br /&gt;&lt;/th&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/th&gt;&lt;/tr&gt;&lt;/table&gt;');"
   //	>
           
           CurrBalise := Attributes.Value('onmouseover');
           CurrBalise := lowercase(CurrBalise);

           sLang := '>' + LangParsing.GetData('galaxy_lw_LuneTaille', 'taille');

           xPos := pos(sLang, CurrBalise);
           if xPos > 0 then begin
              System.Delete(CurrBalise, 1, xPos + 1);

              xPos := pos('<th>', CurrBalise);
              if xPos > 0 then begin
                 System.Delete(CurrBalise, 1, xPos + length('<th>') - 1);

                 xPos := pos('<', CurrBalise);
                 if xPos > 0 then begin
                    strx := copy(CurrBalise, 1, xPos - 1);

                    strx := sfcRemplace(strx, '.', '');
                    FCurrentPlanete.Lune.Surface := StrToIntDef(strx, -1);

                    if FCurrentPlanete.Lune.Surface > 0 then begin
                       // essaye d'extraire la temperature
                       xPos := pos(':', CurrBalise);

                       if xPos > 0 then begin
                          System.Delete(CurrBalise, 1, xPos + 1);

                          xPos := pos('<th>', CurrBalise);
                          if xPos > 0 then begin
                             System.Delete(CurrBalise, 1, xPos + length('<th>') - 1);

                             xPos := pos('<', CurrBalise);
                             if xPos > 0 then begin
                                strx := copy(CurrBalise, 1, xPos - 1);

                                strx := sfcRemplace(strx, '.', '');
                                FCurrentPlanete.Lune.Temperature := StrToIntDef(strx, -1);
                             end;

                          end;
                       end;

                    end;

                 end;

              end;
           end;



         end else if (FTableColonne = 1) then begin
            // Etrangement, juste après la position, un lien vide indique la quantité
            // de débris dans le champ de ruine... (si il existe)

            // FR:  <a href="#" title="Champ de débris : M : 0, C : 900"></a>
            // ORG: <a href="#" title="Debris field: M: 0, K: 900"></a>

            // pour reperer les champs de ruine
            // <a href="#" title="Champ de débris : M : 7.200, C : 0"></a>
            // <a href="#" title="Debris field: M: 0, K: 6.000"></a>
            CurrBalise := Attributes.Value('href');

            if CurrBalise = '#' then begin
               // FFullContent
               // clé vuegen_poslw_debris
               if pos(LangParsing.GetData('vuegen_poslw_debris', 'champ'), lowercase(FFullContent)) > 0 then begin
                  // information sur un champ de debris probable
                  xPos := pos(':', FFullContent);

                  if xPos > 0 then begin
                     System.Delete(FFullContent, 1, xPos);
                     FFullContent := trim(FFullContent);
                     FFullContent := sfcRemplace(FFullContent, '.', '');

                     xPos := pos(',', FFullContent);

                     if xPos > 0 then begin
                        strx := copy(FFullContent, 1, xPos - 1);
                        System.Delete(FFullContent, 1, xPos);

                        FCurrentPlanete.Ruines.Metal := sfcTokenGetInt(strx, 2, ':', -1);
                        FCurrentPlanete.Ruines.Cristal := sfcTokenGetInt(FFullContent, 2, ':', -1);

                        if (FCurrentPlanete.Ruines.Metal < 0) or (FCurrentPlanete.Ruines.Cristal < 0) then begin
                           // erreur...
                           FCurrentPlanete.Ruines.Metal := 0;
                           FCurrentPlanete.Ruines.Cristal := 0;
                        end;


                     end;

                  end;

               end;
            end;

         end;

      end;

   end else if TagName = 'img' then begin
      // <img src="http://xxxx/planeten/small/s_mond.jpg" height="22" width="22" alt="M Taille : 400"/>

      if (FInTable) and (FTableLigne >= 3) then begin

         if (FTableColonne = 4) then begin
            // image de la lune certainement
            CurrBalise := Attributes.Value('src');

            xPos := LastDelimiter('/\', CurrBalise);
            if xPos < 1 then begin
               exit;
            end;
            System.Delete(CurrBalise, 1, xPos);

            if SameText(CurrBalise, 's_mond.jpg') then begin
               // lune
               CurrBalise := Attributes.Value('alt');

               xPos := pos(':', CurrBalise);
               if xPos < 1 then begin
                  exit;
               end;

               System.Delete(CurrBalise, 1, xPos);
               CurrBalise := trim(CurrBalise);

               if FCurrentPlanete.Lune.Surface < 1 then begin
                  CurrBalise := sfcRemplace(CurrBalise, '.', '');
                  FCurrentPlanete.Lune.Surface := StrToIntDef(CurrBalise, -1);
                  FCurrentPlanete.Lune.Temperature := -10000;
               end;

            end;

         end;


      end;


   end else if TagName = 'input' then begin
//<input type="hidden" name="session" value="000000000">
//<input type="hidden" id="auto" value="dr">
       CurrBalise := lowercase(Attributes.Value('type'));

       if CurrBalise = 'hidden' then begin
          CurrBalise := lowercase(Attributes.Value('name'));

          if CurrBalise = 'session' then begin
             FSessionKey := Attributes.Value('value');
          end;


       end else if (CurrBalise = 'text') or (CurrBalise = '') then begin
          CurrBalise := lowercase(Attributes.Value('name'));

          if CurrBalise = 'galaxy' then begin
             FGalaxie := StrToIntDef(Attributes.Value('value'), -1);
          end else if CurrBalise = 'system' then begin
             FSystemSolaire := StrToIntDef(Attributes.Value('value'), -1);
          end;
          
          // Champs fixe
          FCurrentPlanete.Location.Galaxie       := FGalaxie;
          FCurrentPlanete.Location.SystemSolaire := FSystemSolaire;
          FCurrentPlanete.Date := DateTimetoUnix(Now);

       end;

       FInTable := false;


   end;






end;


(*
Fonction obsolete avec la nouvelle version
procedure TParsingGalaxie.TraitementFlags(sFlags: string);
var i, lng: integer;
begin


    lng := length(sFlags);

    for i := 1 to lng do begin

       case sFlags[i] of
           'i': sfcFlagsAdd(CNT_GALAXIE_FLAGS_INACTIF_2SEMAINES, FCurrentPlanete.Flags);
           'I': sfcFlagsAdd(CNT_GALAXIE_FLAGS_INACTIF_4SEMAINES, FCurrentPlanete.Flags);
           'g': sfcFlagsAdd(CNT_GALAXIE_FLAGS_USER_BLOQUE, FCurrentPlanete.Flags);
       end;

    end;


end;
*)

procedure TParsingGalaxie.ScanOnContent(Sender: TObject; Content: string);
var xPos, xPos2: integer;
    sContent: string;
begin


  //  if NoT(FInTableauGalaxie) then exit;

    if FInScript then begin
       //FFullContent := FFullContent + ' ' + Content;
       exit;
    end;



    if FInTable then begin

        if FTableLigne < 3 then exit;

        Content := sfcRemplace(Content, '&nbsp;', ' ');
        Content := trim(Content);


         case FTableColonne of
             1: begin
                    // CITATION OBSOLETE avec la nouvelle version (73c):
                    // Position de la planete <a title="Champ de ruines M:0,K:1.800">T</a>
                    // Taille de la lune <a title="Lune S:1444,T:01">M </a>
                    // Champs de ruine

                    Content := trim(Content);
                    
                    try

                       // Il se peut que la lettre T ou M figure dans la suite
                       if FCurrentPlanete.Location.Position < 0 then
                          FCurrentPlanete.Location.Position := StrToInt(Content);

                    except
                       FCurrentPlanete.Location.Position := -1;
                    end;



                end;

             2: begin
                    // Operation sur la planète
                    // Inutile, on ignore

                end;
(*

                    end else begin
                       //  protection des noob:
                       // xxxxxxx ( <font color=a0ffa0>yyyyyyyyyy<font color=#ffffff> )
                       // Il y a des balises font dans ce cas la

                       // Mode vacances avec iI
                       //<font color= 00ff00>[ally]</font></a> nom planete ( <font color=#0000ff>nick</font>(iI) )


                       // Joueur et planete
                       // nom planete ( nick )
                       // nom planete ( nick(i) )

                       // Au cas où se serai un cas spécial (bloqué, mode vacance, inactif)
                       Inc(FStateColPlanete);


                       case FStateColPlanete of
                           1: begin
                                   // Premier passage (sans compter l'alliance)

                                   // Les parenthèses sont interdites dans le nom de la planète
                                   // On extrait directement le nom de la planète, il existe obligatoirement
                                   xPos := pos('(', Content);
                                   if xPos = 0 then begin
                                      if FAllowOneError = false then
                                         FError := true
                                      else
                                         FAllowOneError := false;

                                      exit;
                                   end;

                                   // Extrait le nom de la planète
                                   FCurrentPlanete.NomPlanete := trim(copy(Content, 1, xPos - 1));

                                   // Supprime le nom de la planète
                                   System.Delete(Content, 1, xPos);
                                   Content := trimleft(Content);

                                   // Maintenant, il se peut que l'on rencontre une balise font
                                   // pour un joueur noob/trop fort/en vacance
                                   // Exemple:     nom planete ( <font color=#0000ff>nick</font>(iI) )
                                   // les flags (bloqué, inactif), sont toujours à l'extérieur de la balise font

                                   // Si il y a pas de balises fonts, alors
                                   // La chaine originale "planetName ( playerName(i) )"
                                   // est devenu          " playerName(i) )"

                                   xPos := pos(')', Content);
                                   if xPos = 0 then begin
                                      // il doit avoir une balise font
                                      exit;
                                   end;

                                   // On va supposer que les parenthèses sont interdites dans le nom du joueur
                                   xPos2 := pos('(', Content);
                                   if xPos2 > 0 then begin
                                      // Il existe des flags (iIg)
                                      FCurrentPlanete.Joueur := trim(copy(Content, 1, xPos2 - 1));

                                      System.Delete(Content, 1, xPos2);

                                      xPos := pos(')', Content);
                                      if xPos > 0 then begin
                                         System.Delete(Content, xPos, maxint);

                                         // Il ne reste plus que les flags dans Content
                                         TraitementFlags(Content);

                                      end;

                                   end else begin
                                      // pas de flags, il ne reste donc que le nom du joueur
                                      FCurrentPlanete.Joueur := trim(copy(Content, 1, xPos - 1));
                                   end;

                              end;


                           3: begin
                                   // La balise font vient de se terminer, il reste les flags
                                   // et la parenthèse de fin
                                   // PlanetName ( <font color=#0000ff>nick</font>(iI) )
                                   // Exemple: (iI) )
                                   // ou encore la parenthèse de fin toute seule

                                   xPos := pos('(', Content);
                                   if xPos > 0 then begin
                                      // il existe des flags, on les traite
                                      System.Delete(Content, 1, xPos);

                                      xPos := pos(')', Content);
                                      if xPos > 0 then begin
                                         System.Delete(Content, xPos, maxint);

                                         TraitementFlags(Content);
                                      end;

                                   end;

                              end;

                       end;


                    end;

                end;
*)

             3: begin
                     // Nom de la planète et activité
                     // Ex: nom planete (19 min)
                     //     Colonie (*)

                     xPos := LastDelimiter('(', Content);
                     if xPos > 0 then begin
                        System.Delete(Content, xPos, maxint);
                        Content := trim(Content);
                     end;

                     FCurrentPlanete.NomPlanete := Content;

                end;

             4: begin
                     // lune
                     // on extrait les informations
                     
                end;

             5: begin
                     // débris

                end;

             6: begin
                     // Joueur et Statut
                     // (<span class='inactive'>i</span> <span class='vacation'>v</span>)
                     if Content = '(' then begin
                        FInTagOption := true;

                     end else if Content = ')' then begin
                        FInTagOption := false;

                     end else begin

                        if FInTagOption then begin
                           Content := trim(content);


                           if Content = LangParsing.GetData('galaxy_joueur_fort', 'f') then begin
                              // joueur fort
                              sfcFlagsAdd(CNT_GALAXIE_FLAGS_PROTECTION_NOOB_TROPFORT, FCurrentPlanete.Flags);

                           end else if Content = LangParsing.GetData('galaxy_joueur_debutant', 'd') then begin
                              // joueur faible
                              sfcFlagsAdd(CNT_GALAXIE_FLAGS_PROTECTION_NOOB_TROPFAIBLE, FCurrentPlanete.Flags);

                           end else if Content = LangParsing.GetData('galaxy_joueur_vacance', 'v') then begin
                              // Mode vacances
                              sfcFlagsAdd(CNT_GALAXIE_FLAGS_MODE_VACANCES, FCurrentPlanete.Flags);

                           end else if Content = LangParsing.GetData('galaxy_joueur_bloque', 'b') then begin
                              // Bloqué
                              sfcFlagsAdd(CNT_GALAXIE_FLAGS_USER_BLOQUE, FCurrentPlanete.Flags);

                           end else if Content = LangParsing.GetData('galaxy_joueur_inactif2', 'i') then begin
                              // Inactif 2 semaines
                              sfcFlagsAdd(CNT_GALAXIE_FLAGS_INACTIF_2SEMAINES, FCurrentPlanete.Flags);

                           end else if Content = LangParsing.GetData('galaxy_joueur_inactif4', 'I') then begin
                              // Inactif 4 semaines
                              sfcFlagsAdd(CNT_GALAXIE_FLAGS_INACTIF_4SEMAINES, FCurrentPlanete.Flags);

                           end;



                        end else begin
                           FCurrentPlanete.Joueur := Content;
                        end;

                     end;
                     
                end;

             7: begin
                     // Alliance
                     FCurrentPlanete.Alliance := Content;
                end;

         end;


    end;


end;



procedure TParsingGalaxie.ScanOnEndTag(Sender: TObject; TagName: string);
begin
   TagName := lowercase(TagName);

   if TagName = 'script' then begin
      FInScript := false;
      FFullContent := '';


      // Ajoute l element, et le réinitialise
      CheckAndAjoutCurrent;


   end else if TagName = 'tr' then begin
      // La balise de fin de ligne n existe pas

   end else if TagName = 'font' then begin
      FInFont := false;
      FFontColor := '';

   end else if TagName = 'a' then begin
      FInLink := false;

   end;



end;






constructor TParsingGalaxie.Create;
begin
   inherited;

   FListPlanete := TListGalaxiePlaneteSP.Create;
   FDontAddPointeur := false;
end;


destructor TParsingGalaxie.Destroy;
begin

   FListPlanete.Free;

   inherited Destroy;
end;



end.
